package main

import "fmt"

//方法  就是一个包含了接收者的函数,接收者可以是命名类型或者结构体类型的一个值或者是一个指针
//方法的定义格式
//  func (接收者变量  接收者类型) 方法名(参数列表)(返回参数){
// 接收者变量: 接收者中的参数变量名在命令时，使用接收者类型名的第一个小写字母
// 接受者类型: 可以是指针类型和非指针类型
//       函数体
//}
// type dog struct {
// 	name string
// }

//构造函数
// func newdog(name string) *dog {
// 	return &dog{
// 		name: name,
// 	}
// }
//func newperson(name string, age int) *person {
//	return &person{
//		name: name,
//		age:  age,
//	}
//}

//方法是作用于特定类型的函数
//接收者表示的是调用该方法的具体类型变量，多用结构体类型名首字母小写表示
// func (d dog)wang(){  //d dog 是接收者
// 	 fmt.Printf("%s:汪汪汪",d.name)

// }

//定义结构体
type person struct {
	name string
	age  int
}

//构造函数
func newperson(name string, age int) *person {
	return &person{
		name: name,
		age:  age,
	}
}

//值类型接收者: 传深拷贝进去
func (p person) guonian() {
	p.age++
}

//指针接收者: 传内存地址进去(浅拷贝)
func (p *person) guonian_point() {
	p.age++
}
func main() {
	p1 := newperson("wangxudong", 19)
	p1.guonian() //调用方法guoninan
	fmt.Println(p1.age)
	p1.guonian_point()
	fmt.Println(p1.age)
}

//func main() {
//	// d1:=newdog("金毛")
//	// d1.wang()
//	//p1 := newperson("wangxudong", 19)
//	//p1.guonian() //调用方法guoninan
//	//fmt.Println(p1.age)
//	//p1.guonian_point()
//	//fmt.Println(p1.age)
//	p1 := &person{
//		"wxd",
//		19,
//	}
//	p1.guonian()
//	fmt.Println(p1.age)
//}

//什么时候需要使用指针类型接收者
// 需要修改接收者中的值
// 接收者是拷贝代价比较大的大对象
// 保证一致性 如果有某个方法使用了指针接收者 那么其他方法也应该使用指针接收者
